前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
  • 基础篇

    • 环境搭建
    • node部署
    • 基础应用
  • 内置模块

    • 1.0 本地路径处理 path
    • 2.0 文件系统操作 fs
    • 3.1 基础调试 console
    • 3.2 本地调试远程服务器上的Node代码
    • 4.1 网络服务 http
    • 4.2 网络服务 http res
    • 4.3 网络服务 http req
    • 4.4 网络服务 http server
    • 4.5 网络服务 http client
    • 4.6 网络服务 https
    • 4.7 网络TCP net
    • 4.8 网络UDP dgram
    • 4.9 域名解析 dns
    • 5.0 网络地址解析 url
    • 5.1 URL查询字符串 querystring
    • 6.1 流操作 stream
    • 6.2 逐行读取 readline
    • 7.1 进程相关 process
    • 7.2 子进程 child
    • 8.1 二进制数据 buffer
    • 8.2 二进制解码 string_decoder
    • 9.1 事件机制 events
    • 9.2 实用工具模块 util
    • 9.3 数据加密 crypto
    • 9.4 MD5入门介绍及crypto模块的应用
    • 9.4 资源压缩 zlib
    • 9.5 集群 cluster
    • 9.6 v8
  • 进阶篇

    • 5分钟入门非对称加密用法
    • cluster
    • cookie_parser深入
    • crypto模块之理论篇
    • express+cookie_parser签名机制深入剖析
    • express+session实现简易身份认证
    • https
    • log4js入门实例
    • node8_napi
    • 使用 async 控制并发
    • 使用 eventproxy 控制并发
    • 使用 superagent 与 cheerio 完成简单爬虫
    • 基于express+muter的文件上传
    • 将图片转成datauri嵌入到html
    • 常用中间件 body_parser 实现解析
    • 日志模块morgan
    • 服务端字符编解码&乱码处理 charset_enc_dec
    • 测试用例mocha,should,istanbul
    • 调试日志打印debug模块
  • Express

    • 1.1 Express概览篇
    • 1.2 Express
  • Koa2

    • 1.0 koa2概览篇
    • 1.1 快速开始
    • 1.2 async await使用
    • 1.3 koa2简析结构
    • 1.4 koa中间件开发与使用
    • 10.1 单元测试
    • 11.1 开发debug
    • 12.1 快速启动
    • 12.2 框架设计
    • 12.3 分层操作
    • 12.4 数据库设计
    • 12.5 路由设计
    • 12.6 webpack4环境搭建
    • 12.7 使用react
    • 12.8 登录注册功能实现
    • 12.9 session登录态判断处理
    • 13.1 import export使用
    • 2.1 原生koa2实现路由
    • 2.2 koa router中间
    • 3.1 GET请求数据获取
    • 3.2 POST请求数据获取
    • 3.3 koa bodyparser中间件
    • 4.1 原生koa2实现静态资源服务器
    • 4.2 koa static中间件
    • 5.1 koa2使用cookie
    • 5.2 koa2实现session
    • 6.1 koa2加载模板引擎
    • 6.2 ejs模板引擎
    • 7.1 busboy模块
    • 7.2 上传文件简单实现
    • 7.3 异步上传图片实现
    • 8.1 mysql模块
    • 8.2 async await封装使用mysql
    • 8.3 项目建表初始化
    • 9.1 原生koa2实现JSONP
    • 9.2 koa jsonp中间件
  • 其他

    • 操作数据库
    • Session 与 Token
    • Cookie、Session、Token、JWT
    • Socket

# koa-bodyparser中间件

30 秒速记

  • koa-bodyparser 把请求体解析好挂到 ctx.request.body,不用自己读流
  • 默认只开 json 和 form,text 要手动打开,不支持 multipart 文件上传
  • 默认上限:jsonLimit 和 textLimit 是 1mb,formLimit 是 56kb,超了返回 413
  • 格式坏的 JSON 会抛 400,不支持的类型直接跳过,body 是空对象
  • 要做 Webhook 验签就得拿原始字符串,解析后再 JSON.stringify 回去对不上签名

koa-bodyparser 干的事就是把上一节手写的那套读流、拼接、解析封装成中间件,结果放在 ctx.request.body 上。 它按 Content-Type 决定怎么解析:application/json 走 JSON 解析,表单走 urlencoded 解析,大小限制、编码、坏数据报错都处理好了。要记住的是它的边界:默认只认 json 和 form,文件上传它不管,要用 koa-body 或 @koa/multer;默认的 formLimit 只有 56kb,表单里有长文本时很容易撞上 413。

理解「koa-bodyparser中间件」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 middleware 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

面试官追问

追问 1没注册 koa-bodyparser,直接读 ctx.request.body.username 会怎样?
参考回答

Koa 本身不解析请求体,ctx.request.body 是 undefined,再读 .username 就抛 TypeError。请求体解析从来都是中间件的活。

追问 2富文本编辑器提交一篇长文章,接口返回 413,怎么回事?
参考回答

表单类型默认 formLimit 只有 56kb,长文章很容易超。按业务调大,比如 bodyParser({ formLimit: '2mb' }),别图省事直接写个很大的值。

追问 3前端发了一个 text/plain 的请求,ctx.request.body 是空对象,为什么?
参考回答

默认 enableTypes 只有 ['json', 'form'],其他类型直接跳过不解析。要支持就配 enableTypes: ['json', 'form', 'text']。

追问 4接 GitHub 的 Webhook 要验签,能拿 ctx.request.body 算吗?
参考回答

不能。签名是对原始字节算的,解析成对象再序列化,空格、键顺序都可能变,签名对不上。要用原始请求体,比如 koa-bodyparser 新版本挂在 ctx.request.rawBody 上的字符串。

追问 5客户端发了一个格式坏掉的 JSON,服务端会怎么响应?
参考回答

中间件会抛一个 status 为 400 的错误。默认交给 Koa 的错误处理返回 400,也可以传 onerror 自己定响应格式,别让它变成 500。

# koa-bodyparser中间件

# 原理

30 秒速记

  • 原理:中间件在业务之前读完 ctx.req 流,解析后写到 ctx.request.body,再 await next()
  • 按 Content-Type 分流:json → JSON.parse,form → querystring 解析
  • 底层是 co-body + raw-body,负责限长、编码和流读取
  • 注意是 ctx.request.body,不是 ctx.body,后者是响应体

它的原理很简单:在业务中间件之前把请求流读完、解析好,挂到 ctx.request.body 上,然后 await next() 交给后面的中间件。 这正是 Koa 洋葱模型的典型用法,前置中间件给 ctx 加料,后面的业务代码直接拿结果。解析方式看请求头的 Content-Type,JSON 和表单各走各的解析器,底层用的是 co-body。最常见的混淆是 ctx.request.body 和 ctx.body:前者是请求体,后者是你要返回给客户端的响应体,完全是两个东西。

对于POST请求的处理,koa-bodyparser中间件可以把koa2上下文的formData数据解析到ctx.request.body中

理解「原理」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 module 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

面试官追问

追问 1能不能用几行代码说清楚它大概怎么实现的?
参考回答

核心就是:app.use(async (ctx, next) => { ctx.request.body = await parse(ctx.req); await next() })。parse 里读流、限长、按类型解析,读完再放行。

追问 2ctx.request.body 和 ctx.body 有什么区别?
参考回答

ctx.request.body 是中间件解析出来的请求数据,ctx.body 是 ctx.response.body 的简写,是要发给客户端的响应。业务代码读前者、写后者。

追问 3为什么 bodyParser 必须注册在路由前面?
参考回答

Koa 中间件按注册顺序执行,业务路由先跑的话那时候还没人解析过请求体。而且路由处理完通常不调 next(),后面的 bodyParser 根本轮不到执行。

追问 4请求流只能读一次,前面已经有中间件读过了,会怎样?
参考回答

bodyParser 再读就拿不到数据,可能一直等不到 end 或者得到空结果。所以一个请求只让一个地方去读原始流,要原文就用解析中间件提供的 rawBody。

追问 5前端用浏览器的 FormData 对象提交,ctx.request.body 怎么是空的?
参考回答

fetch 发 FormData 时 Content-Type 是 multipart/form-data,koa-bodyparser 不处理这种类型。要么前端改用 URLSearchParams 或 JSON,要么后端换 koa-body 并开 multipart: true。

# 安装koa2版本的koa-bodyparser@3中间件

30 秒速记

  • 安装:npm install --save koa-bodyparser@3,@3 是早年支持 Koa 2 的版本线
  • 现在新项目直接装 4.x,同样支持 Koa 2,API 基本兼容
  • npm 5 起 install 默认就会写进 dependencies,--save 可以省略
  • 锁文件要提交,CI 用 npm ci 按锁文件装,保证各环境版本一致

这一步就是装依赖,指定 @3 是因为当年 koa-bodyparser 的 2.x 对应 Koa 1,3.x 才开始支持 Koa 2 的 async 中间件。 现在已经是 4.x 了,同样跑在 Koa 2 上,用法几乎一样,新项目没必要再锁 @3。--save 是老习惯,npm 5 之后 install 默认就写进 package.json。真正要注意的是团队协作:package-lock.json 要提交,CI 里用 npm ci,不然各人机器上装出来的依赖树可能不一样。

npm install --save koa-bodyparser@3
@前端进阶之旅: 代码已经复制到剪贴板

理解「安装koa2版本的koa-bodyparser@3中间件」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 middleware 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

面试官追问

追问 1为什么文档里特意写 @3,直接装最新的不行吗?
参考回答

写这篇的时候 Koa 2 刚出,koa-bodyparser 最新版还停在给 Koa 1 用的生成器写法,必须指定 3.x 才能配 async 中间件。现在最新的 4.x 本身就支持 Koa 2,直接装最新就行。

追问 2npm install 和 npm ci 有什么区别,CI 里该用哪个?
参考回答

npm ci 严格按锁文件装,会先删掉 node_modules,锁文件和 package.json 对不上就直接报错。CI 里就该用它,结果可复现。

追问 3本地能跑,CI 报 Cannot find module 'koa-bodyparser',最可能是什么原因?
参考回答

本地是手动装过但没写进 package.json,或者 package.json 改了没提交。看一下 dependencies 里有没有它,本地删掉 node_modules 重装一遍就能复现。

追问 4装完依赖退出码是 0,能说明中间件已经可用了吗?
参考回答

只说明包下载成功了。还得在代码里 require 并

基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
  • 基础篇

    • 环境搭建
    • node部署
    • 基础应用
  • 内置模块

    • 1.0 本地路径处理 path
    • 2.0 文件系统操作 fs
    • 3.1 基础调试 console
    • 3.2 本地调试远程服务器上的Node代码
    • 4.1 网络服务 http
    • 4.2 网络服务 http res
    • 4.3 网络服务 http req
    • 4.4 网络服务 http server
    • 4.5 网络服务 http client
    • 4.6 网络服务 https
    • 4.7 网络TCP net
    • 4.8 网络UDP dgram
    • 4.9 域名解析 dns
    • 5.0 网络地址解析 url
    • 5.1 URL查询字符串 querystring
    • 6.1 流操作 stream
    • 6.2 逐行读取 readline
    • 7.1 进程相关 process
    • 7.2 子进程 child
    • 8.1 二进制数据 buffer
    • 8.2 二进制解码 string_decoder
    • 9.1 事件机制 events
    • 9.2 实用工具模块 util
    • 9.3 数据加密 crypto
    • 9.4 MD5入门介绍及crypto模块的应用
    • 9.4 资源压缩 zlib
    • 9.5 集群 cluster
    • 9.6 v8
  • 进阶篇

    • 5分钟入门非对称加密用法
    • cluster
    • cookie_parser深入
    • crypto模块之理论篇
    • express+cookie_parser签名机制深入剖析
    • express+session实现简易身份认证
    • https
    • log4js入门实例
    • node8_napi
    • 使用 async 控制并发
    • 使用 eventproxy 控制并发
    • 使用 superagent 与 cheerio 完成简单爬虫
    • 基于express+muter的文件上传
    • 将图片转成datauri嵌入到html
    • 常用中间件 body_parser 实现解析
    • 日志模块morgan
    • 服务端字符编解码&乱码处理 charset_enc_dec
    • 测试用例mocha,should,istanbul
    • 调试日志打印debug模块
  • Express

    • 1.1 Express概览篇
    • 1.2 Express
  • Koa2

    • 1.0 koa2概览篇
    • 1.1 快速开始
    • 1.2 async await使用
    • 1.3 koa2简析结构
    • 1.4 koa中间件开发与使用
    • 10.1 单元测试
    • 11.1 开发debug
    • 12.1 快速启动
    • 12.2 框架设计
    • 12.3 分层操作
    • 12.4 数据库设计
    • 12.5 路由设计
    • 12.6 webpack4环境搭建
    • 12.7 使用react
    • 12.8 登录注册功能实现
    • 12.9 session登录态判断处理
    • 13.1 import export使用
    • 2.1 原生koa2实现路由
    • 2.2 koa router中间
    • 3.1 GET请求数据获取
    • 3.2 POST请求数据获取
    • 3.3 koa bodyparser中间件
    • 4.1 原生koa2实现静态资源服务器
    • 4.2 koa static中间件
    • 5.1 koa2使用cookie
    • 5.2 koa2实现session
    • 6.1 koa2加载模板引擎
    • 6.2 ejs模板引擎
    • 7.1 busboy模块
    • 7.2 上传文件简单实现
    • 7.3 异步上传图片实现
    • 8.1 mysql模块
    • 8.2 async await封装使用mysql
    • 8.3 项目建表初始化
    • 9.1 原生koa2实现JSONP
    • 9.2 koa jsonp中间件
  • 其他

    • 操作数据库
    • Session 与 Token
    • Cookie、Session、Token、JWT
    • Socket
完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

koa-bodyparser中间件|Nodejs专题系列

# koa-bodyparser中间件

30 秒速记

  • koa-bodyparser 把请求体解析好挂到 ctx.request.body,不用自己读流
  • 默认只开 json 和 form,text 要手动打开,不支持 multipart 文件上传
  • 默认上限:jsonLimit 和 textLimit 是 1mb,formLimit 是 56kb,超了返回 413
  • 格式坏的 JSON 会抛 400,不支持的类型直接跳过,body 是空对象
  • 要做 Webhook 验签就得拿原始字符串,解析后再 JSON.stringify 回去对不上签名

koa-bodyparser 干的事就是把上一节手写的那套读流、拼接、解析封装成中间件,结果放在 ctx.request.body 上。 它按 Content-Type 决定怎么解析:application/json 走 JSON 解析,表单走 urlencoded 解析,大小限制、编码、坏数据报错都处理好了。要记住的是它的边界:默认只认 json 和 form,文件上传它不管,要用 koa-body 或 @koa/multer;默认的 formLimit 只有 56kb,表单里有长文本时很容易撞上 413。

理解「koa-bodyparser中间件」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 middleware 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

面试官追问

追问 1没注册 koa-bodyparser,直接读 ctx.request.body.username 会怎样?
参考回答

Koa 本身不解析请求体,ctx.request.body 是 undefined,再读 .username 就抛 TypeError。请求体解析从来都是中间件的活。

追问 2富文本编辑器提交一篇长文章,接口返回 413,怎么回事?
参考回答

表单类型默认 formLimit 只有 56kb,长文章很容易超。按业务调大,比如 bodyParser({ formLimit: '2mb' }),别图省事直接写个很大的值。

追问 3前端发了一个 text/plain 的请求,ctx.request.body 是空对象,为什么?
参考回答

默认 enableTypes 只有 ['json', 'form'],其他类型直接跳过不解析。要支持就配 enableTypes: ['json', 'form', 'text']。

追问 4接 GitHub 的 Webhook 要验签,能拿 ctx.request.body 算吗?
参考回答

不能。签名是对原始字节算的,解析成对象再序列化,空格、键顺序都可能变,签名对不上。要用原始请求体,比如 koa-bodyparser 新版本挂在 ctx.request.rawBody 上的字符串。

追问 5客户端发了一个格式坏掉的 JSON,服务端会怎么响应?
参考回答

中间件会抛一个 status 为 400 的错误。默认交给 Koa 的错误处理返回 400,也可以传 onerror 自己定响应格式,别让它变成 500。

# koa-bodyparser中间件

# 原理

30 秒速记

  • 原理:中间件在业务之前读完 ctx.req 流,解析后写到 ctx.request.body,再 await next()
  • 按 Content-Type 分流:json → JSON.parse,form → querystring 解析
  • 底层是 co-body + raw-body,负责限长、编码和流读取
  • 注意是 ctx.request.body,不是 ctx.body,后者是响应体

它的原理很简单:在业务中间件之前把请求流读完、解析好,挂到 ctx.request.body 上,然后 await next() 交给后面的中间件。 这正是 Koa 洋葱模型的典型用法,前置中间件给 ctx 加料,后面的业务代码直接拿结果。解析方式看请求头的 Content-Type,JSON 和表单各走各的解析器,底层用的是 co-body。最常见的混淆是 ctx.request.body 和 ctx.body:前者是请求体,后者是你要返回给客户端的响应体,完全是两个东西。

对于POST请求的处理,koa-bodyparser中间件可以把koa2上下文的formData数据解析到ctx.request.body中

理解「原理」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 module 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

面试官追问

追问 1能不能用几行代码说清楚它大概怎么实现的?
参考回答

核心就是:app.use(async (ctx, next) => { ctx.request.body = await parse(ctx.req); await next() })。parse 里读流、限长、按类型解析,读完再放行。

追问 2ctx.request.body 和 ctx.body 有什么区别?
参考回答

ctx.request.body 是中间件解析出来的请求数据,ctx.body 是 ctx.response.body 的简写,是要发给客户端的响应。业务代码读前者、写后者。

追问 3为什么 bodyParser 必须注册在路由前面?
参考回答

Koa 中间件按注册顺序执行,业务路由先跑的话那时候还没人解析过请求体。而且路由处理完通常不调 next(),后面的 bodyParser 根本轮不到执行。

追问 4请求流只能读一次,前面已经有中间件读过了,会怎样?
参考回答

bodyParser 再读就拿不到数据,可能一直等不到 end 或者得到空结果。所以一个请求只让一个地方去读原始流,要原文就用解析中间件提供的 rawBody。

追问 5前端用浏览器的 FormData 对象提交,ctx.request.body 怎么是空的?
参考回答

fetch 发 FormData 时 Content-Type 是 multipart/form-data,koa-bodyparser 不处理这种类型。要么前端改用 URLSearchParams 或 JSON,要么后端换 koa-body 并开 multipart: true。

# 安装koa2版本的koa-bodyparser@3中间件

30 秒速记

  • 安装:npm install --save koa-bodyparser@3,@3 是早年支持 Koa 2 的版本线
  • 现在新项目直接装 4.x,同样支持 Koa 2,API 基本兼容
  • npm 5 起 install 默认就会写进 dependencies,--save 可以省略
  • 锁文件要提交,CI 用 npm ci 按锁文件装,保证各环境版本一致

这一步就是装依赖,指定 @3 是因为当年 koa-bodyparser 的 2.x 对应 Koa 1,3.x 才开始支持 Koa 2 的 async 中间件。 现在已经是 4.x 了,同样跑在 Koa 2 上,用法几乎一样,新项目没必要再锁 @3。--save 是老习惯,npm 5 之后 install 默认就写进 package.json。真正要注意的是团队协作:package-lock.json 要提交,CI 里用 npm ci,不然各人机器上装出来的依赖树可能不一样。

npm install --save koa-bodyparser@3
@前端进阶之旅: 代码已经复制到剪贴板

理解「安装koa2版本的koa-bodyparser@3中间件」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 middleware 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

面试官追问

追问 1为什么文档里特意写 @3,直接装最新的不行吗?
参考回答

写这篇的时候 Koa 2 刚出,koa-bodyparser 最新版还停在给 Koa 1 用的生成器写法,必须指定 3.x 才能配 async 中间件。现在最新的 4.x 本身就支持 Koa 2,直接装最新就行。

追问 2npm install 和 npm ci 有什么区别,CI 里该用哪个?
参考回答

npm ci 严格按锁文件装,会先删掉 node_modules,锁文件和 package.json 对不上就直接报错。CI 里就该用它,结果可复现。

追问 3本地能跑,CI 报 Cannot find module 'koa-bodyparser',最可能是什么原因?
参考回答

本地是手动装过但没写进 package.json,或者 package.json 改了没提交。看一下 dependencies 里有没有它,本地删掉 node_modules 重装一遍就能复现。

追问 4装完依赖退出码是 0,能说明中间件已经可用了吗?
参考回答

只说明包下载成功了。还得在代码里 require 并 app.use(bodyParser()),再发一个 POST 看 ctx.request.body 有没有值,这才算接上了。

# 举个例子

30 秒速记

  • 例子和上一节手写版一样:GET / 出表单,POST / 回显数据
  • 区别只在一处:手写的 parsePostData 换成一行 ctx.request.body
  • 换成 JSON 提交同样能拿到对象,前提是请求头写对 Content-Type
  • 验证时故意发一个坏 JSON 和一个超大请求体,看是不是 400 和 413

这个例子就是把上一节的手写解析换成 koa-bodyparser,对比一下就知道中间件省了多少事。 页面和路由都没变,POST 分支里原来要 await parsePostData(ctx),现在直接读 ctx.request.body。好处不止是代码短:+ 转空格、坏编码报 400、超大请求体报 413、客户端断开的清理,这些手写版没处理的边界它都兜住了。跑例子时我会顺手用 curl 发一个 JSON 请求,看同一行代码是不是两种格式都能拿到。

理解「举个例子」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 module 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

← 3.2 POST请求数据获取4.1 原生koa2实现静态资源服务器 →

fe